class Foo(object):
    def do_something(self):
        print("执行流程")

    def close(self):
        print("结束流程")


class Context:
    def __enter__(self):
        print("开始流程")
        self.data = Foo()
        return self.data

    def __exit__(self, exc_type, exc_val, excc_tb):
        # print("结束流程")
        self.data.close()


# enter方法返回什么，ctx就是什么
with Context() as ctx:
    ctx.do_something()


################################################


# class Foo(object):
#     def __enter__(self):
#         return 123

#     def __exit__(self, exc_type, exc_val, excc_tb):
#         pass


# obj = Foo()
# with obj as f:
#     print(f)


"""
执行流程：
    1. obj 初始化 Foo 类
    2. 执行enter方法，enter返回的内容就是f的内容
    3. 执行with下方的内部语句
    4. 执行exit方法
    5. 执行结束
"""
